package com.cinema.service;

import com.cinema.model.User;
import com.cinema.model.Admin;
import com.cinema.model.Manager;
import com.cinema.model.FrontDesk;
import com.cinema.util.JsonFileStorage;
import java.util.HashMap;
import java.util.Map;

/**
 * 认证服务类
 * 负责用户登录、注册、密码管理等认证相关功能
 */
public class AuthenticationService {
    private Map<String, User> users;
    private static final String USERS_FILE = "data/users.json";

    /**
     * 构造函数
     * 初始化时加载用户数据并创建默认管理员
     */
    public AuthenticationService() {
        System.out.println("初始化认证服务...");
        loadUsers();
        initializeDefaultAdmin();
        System.out.println("认证服务初始化完成，当前用户数: " + users.size());
    }

    /**
     * 从文件加载用户数据
     */
    private void loadUsers() {
        try {
            users = JsonFileStorage.loadFromFile(HashMap.class, USERS_FILE);
            if (users == null) {
                users = new HashMap<>();
                System.out.println("创建新的用户存储映射");
            }
        } catch (Exception e) {
            System.out.println("加载用户数据失败: " + e.getMessage());
            users = new HashMap<>();
        }
    }

    /**
     * 初始化默认管理员账户
     */
    private void initializeDefaultAdmin() {
        if (!users.containsKey("admin")) {
            Admin admin = new Admin("admin001", "admin", "yuuinfo#777", "13800138000");
            users.put("admin", admin);
            saveUsers();
            System.out.println("已创建默认管理员账户: admin/yuuinfo#777");
        } else {
            System.out.println("默认管理员账户已存在");
        }
    }

    /**
     * 保存用户数据到文件
     * @return 保存是否成功
     */
    private boolean saveUsers() {
        try {
            JsonFileStorage.saveToFile(users, USERS_FILE);
            return true;
        } catch (Exception e) {
            System.out.println("保存用户数据失败: " + e.getMessage());
            return false;
        }
    }

    /**
     * 用户登录
     * @param username 用户名
     * @param password 密码
     * @return 登录成功的用户对象，失败返回null
     */
    public User login(String username, String password) {
        User user = users.get(username);
        if (user != null && user.getPassword().equals(password)) {
            System.out.println("用户登录成功: " + username);
            return user;
        }
        System.out.println("登录失败: " + username);
        return null;
    }

    /**
     * 添加新用户
     * @param user 用户对象
     * @return 添加是否成功
     */
    public boolean addUser(User user) {
        if (users.containsKey(user.getUsername())) {
            System.out.println("用户已存在: " + user.getUsername());
            return false;
        }
        users.put(user.getUsername(), user);
        boolean success = saveUsers();
        if (success) {
            System.out.println("用户添加成功: " + user.getUsername());
        }
        return success;
    }

    /**
     * 获取用户数量
     * @return 用户数量
     */
    public int getUserCount() {
        return users.size();
    }
}